package modelado.soluciones;

import java.util.Collection;
import java.util.List;

import modelado.datos.elementos.Elemento;
import utiles.FactoriaDeColecciones;
import utiles.SituacionIlegal;

public class SolucionListaImpl implements SolucionLista {
	private List<Elemento> lista;

	public SolucionListaImpl() {
		lista = FactoriaDeColecciones.creaList();
	}

	public SolucionListaImpl(Solucion s1, Solucion s2) {
		lista = FactoriaDeColecciones.creaList();
		SolucionLista s1l = (SolucionLista) s1;
		SolucionLista s2l = (SolucionLista) s2;
		lista.addAll(s1l.getLista());
		lista.addAll(s2l.getLista());
	}

	public List<Elemento> getLista() {
		return lista;
	}

	public Elemento getPrimero() {
		if (isEmpty())
			throw new SituacionIlegal("La lista est� vac�a");
		return lista.get(0);
	}

	public Elemento getUltimo() {
		if (isEmpty())
			throw new SituacionIlegal("La lista est� vac�a");
		return lista.get(size() - 1);
	}

	public boolean equals(Object e) {
		boolean r = false;
		if (e instanceof SolucionLista) {
			SolucionLista e1 = (SolucionLista) e;
			r = getLista().equals(e1.getLista());
		}
		return r;
	}

	public Solucion clone() {
		SolucionLista s = new SolucionListaImpl();
		Elemento ec;
		for (Elemento e : getLista()) {
			ec = e.clone();
			s.addElemento(ec);
		}
		return s;
	}

	public Collection<Elemento> getElementosEnSolucion() {
		return lista;
	}

	public boolean isEmpty() {
		return lista.isEmpty();
	}

	public int size() {
		return lista.size();
	}

	public int hashCode() {
		return lista.hashCode();
	}

	public int compareTo(Solucion e) {
		int a = hashCode() - e.hashCode();
		return a;
	}

	public String toString() {
		String r = lista.toString();
		return r;
	}

	public void addElemento(Elemento e) {
		lista.add(e);
	}

	public void addElementos(Iterable<Elemento> e1) {
		for (Elemento e : e1) {
			addElemento(e);
		}

	}

	public void addSolucion(SolucionDiscreta s) {
		for (Elemento e : s.getElementosEnSolucion()) {
			addElemento(e);
		}
	}

}
